package com.SpringIoc.test_1_25_springioc_and_di.Controller;

import com.SpringIoc.test_1_25_springioc_and_di.Config.UserInfo;
import com.SpringIoc.test_1_25_springioc_and_di.Service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController {

    // 属性注入
/*    @Autowired
    private UserService userService; // DI展示*/

    // 构造方法注入
    // private UserService userService;
    // 在注入一个
    //private UserInfo userInfo;

    /*public UserController() {
    }*/

    //@Autowired
   /* public UserController(UserService userService) {
        this.userService = userService;
    }*/

  /*  public UserController(UserService userService, UserInfo userInfo) {
        this.userService = userService;
        this.userInfo = userInfo;
    }*/

    // 如果有了 有参的构造函数, 就不会执行无参的构造函数了

    // Setter 方法注入
    // 就是经常用的 get set 方法

   /* private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }*/
    // 这样写也会报一个空指针异常
    // 所以也要加上 @Autowired 注解

    // @Autowired 的缺陷展示
    @Autowired
    private UserService userService;
    // 使用 Qualifier 指定 Bean
/*    @Qualifier("userInfo1")
    @Autowired
    // private UserInfo userInfo;
    // 但是如果把这个变量名改了呢?
    private UserInfo userInfo;*/

    // 使用 Resource 注解来指定
    @Resource(name = "userInfo2")
    private UserInfo userInfo;

    public void doController(){
        userService.doService(); // DI 展示

        // 再加入多个构造函数之后, 就会报空指针异常
        // 也就是 如果有多个构造函数的时候, 必须要指定是用哪个构造函数


        // 也就是 如果有了无参的构造函数的话, Spring 会默认使用 无参的构造函数
        // 所以会报空指针错误
        // 这时候,把无参构造函数删了, 就又新报一个错误
        // 现在有两个有参的构造函数, 如果没有无参构造函数的话, Spring 就会 不知到用哪一个构造函数了
        // 所以要告诉Spring 要用哪个函数, 怎么告诉呢? 还是用 @Autowired 注解

        System.out.println(userInfo);
        // 这个时候呢就会报错, 会发现有两个 UserInfo
        // 这时候就不知道用哪一个了
        // 呢如何解决呢?


        System.out.println("do Controller...");
    }
    // 那么如何知道Spring 帮我们存储了这个东西呢?


}
